Trabajo Práctico Nº1: Manejo de Puertos

Verónica Romina Bustamante -988640- verobustamante95@gmail.com - vbustamante@fi.uba.ar

Ejercicio 1

Hacer un programa que haga parpadear un LED conectado en el PIN 2 (Usar la rutina de retardo Dada)

Resolución:

Para el ejercicio nos pide que utilicemos un LED conectado en el PIN 2 del Arduino, el Arduino cuenta con el siguiente esquemático:

esquematico_arduino.png

En el esquemático puede observarse el ATMega38p: esquematico_atmega328p.png

El enunciado pide en el pin 2, ahora, esto puede corresponder al pin 2 del puerto o al pin 2 físico como puede observarse en la siguiente imagen:

Pinout_of_ARDUINO_Board_and_ATMega328PU.png

Interpreto que debe referirse al PIN2 del puerto dado que el otro pin corresponde al Rx y aunque es utilizable supone desconectarlo y volverlo a conectar para que el programa funcione, lo que para el enunciado no resulta de complejidad pero si se trabaja con circuitos más complicados puede representar un problema dado que hay que tener cuidado con el resto del circuito.

El circuito para esta práctica fue realizado en protoboard. El ensamblador usado es el del AVRStudio 5. El Arduino posee solo un micro, el ATMega328P, el otro es un integrado CH340G.

El esquemático para el circuito es el siguiente: esquematico%20con%20circuito%201.png

Podemos ver un diagrama a continuación: diagrama%20circuito%201.png

El cálculo de la resistencia del LED fue realizada con la introducción teórica y resultó en una resistencia de 220 Ohm para un LED rojo debido a que es un valor comercial, realizando los cálculos para una $I=20mA$ y una tensión VCC=5V con $V_LED=1,6V$ la resistencia resultaba de R_{led}=170 Ohm, siendo el caso borde donde circula más corriente en el led.

El código para realizar la práctica es el siguiente:

/* * titilarled.asm * * Created: 09/05/2021 08:24:17 p.m. * Author: Vero */ ;.INCLUDE "M32DEF.INC" .equ BITOUT=2 ;Configuro PD0 como salida LDI R21, 0xFF OUT DDRD, R21 ;Titilar MAIN: SBI PORTD,BITOUT ;set bit PD0 CALL DELAY CBI PORTD,BITOUT CALL DELAY CALL MAIN ;Delay de 1s (modificado) DELAY: LDI R18, 80 LDI R19, 255 LDI R20, 255 LOOP: dec R20 brne LOOP dec R19 brne LOOP dec R18 brne LOOP RET

Puede observarse el funcionamiento del programa en los siguientes videos:

In [15]:
from IPython.display import HTML

HTML('<iframe width="560" height="315" src="https://www.youtube.com/embed/l4ITi_VaJGY" frameborder="0" allowfullscreen></iframe>')
Out[15]:
In [17]:
from IPython.display import HTML

HTML('<iframe width="560" height="315" src="https://www.youtube.com/embed/RltYo_ZMsgg" frameborder="0" allowfullscreen></iframe>')
Out[17]:

Analicemos la cantidad de operaciones: $$ (255*3+1)*255+1)*82+1=16017061 $$

Y si el cristal es de 16MHZ y todos los fuses están en 0, el micro estará funcionando a esa frecuencia. Las operaciones para la rutina serán realizadas en: $$operaciones \,por \,segundo=\frac{16017061 \,\text{op}}{16 \,MHz}= 1,001 \,op/s$$

En la práctica esto no ocurrió, se tardaba dos segundos, por lo tanto entendemos que el ATMega328P está funcionando a 8MHZ y para que fuese consistente en el código debía de cambiarse LDI R18, 80 por LDI R18, 41 para reducir la frecuencia ahora que se sabía que el microprocesador no trabaja a 16 MHz: $$ operaciones=(255*3+1)*255+1)*40+1=16017061 \,op $$ $$operaciones \,por \,segundo=\frac{16017061 \,\text{op}}{16 \,MHz}= 1,001 \,op/s$$

En el enunciado original teníamos la siguiente rutina de retardo:

In [ ]:
; Assembly code
; Delay 8 000 000 cycles
; 1s at 8.0 MHz
ldi r18, 41
ldi r19, 150
ldi r20, 128
L1: dec r20
brne L1
dec r19
brne L1
dec r18
brne L1

Al estar R18,R19 y R20 definidas fuera del loop pero no redefinidas dentro del loop se puede obtener como conclusión que van a decrecer la primera vez en 150 y 128 pero luego decrecerán en 255. Esto se puede comprobar realizando un debugging paso a paso en el AVRStudio. Se puede ver estos videos donde se realizó dicha experiencia:

In [22]:
from IPython.display import HTML

HTML('<iframe width="560" height="315" src="https://www.youtube.com/embed/_Asz7_CWNpM" frameborder="0" allowfullscreen></iframe>')
Out[22]:
In [23]:
from IPython.display import HTML

HTML('<iframe width="560" height="315" src="https://www.youtube.com/embed/iTOoSrvxweE" frameborder="0" allowfullscreen></iframe>')
Out[23]:

Ejercicio 2

Modificar programa para que prenda un LED cuando se presiona el pulsador 1 y quede parpadeando hasta que se apague cuando se presiona el botón 2. El LED está conectado a un pin del microcontrolador y los pulsadores a otros dos pines.

Ejercicio 3

Cómo modifica el circuito y el programa, para usar la resistencia de ​pullup ​interna de los ports al conectar el pulsador. ¿Se ahorra algún componente?

Resolución de Ejercicios 2 y 3:

Analicemos la cantidad de operaciones: $$ (255*3+2)*255+2)*80+1=15646961$$

Y si el cristal es de 16MHZ y todos los fuses están en 0, el micro estará funcionando a esa frecuencia. Las operaciones para la rutina serán realizadas en: $$operaciones \,por \,segundo=\frac{15646961 \,\text{op}}{16 \,MHz}= 1,002 \,op/s$$

El esquemático con con las resistencias Pull up activadas es el siguiente: CIRCUITO%20CON%20PULL%20UP.png

El esquemático sin las resistencias activadas es el siguiente: CIRCUITO%20SIN%20PULL%20UP.png

Se realizó un mismo código para ambos ejercicios, para cambiar de ejercicio 2 a 3 basta con cambiar si queremos que use Resistencias Pull Up o no, si USE_PULLUP es 1 uso las resistencias de Pull Up, en caso contrario no las usa.

Sin las resistencias de pull up: Con las dos resistencias de 10K circulan 0,5mA , generando un consumo total de 1mA en el peor de los casos, con lo cual esta carga es perfectamente tolerable para el circuito. Además dado que la corriente que consume la entrada $I_i=10uA$ es del orden de los uA, la caída de tensión sobre esta resistencia cuando la entrada está en estado alto es despreciable y se logra tener una tensión suficiente para que el microcontrolador vea un 1 lógico ($V_{IH}$=2,5V).

Con las resistencias de pull-up no es necesario introducir nuevos componentes al circuito, nos ahorramos las dos resistencias de 10K (ahorrando así costos y evitando puntos de falla).

El código es el siguiente:

.equ LEDPIN=2 .equ SETPIN=7 .equ RESETPIN=6 .equ USE_PULLUP=1 ;1 es para usar resistores internos ;Configuro el puerto donde esta el led como salida LDI R21, (1<

Videos de la experiencia realizada en el los puntos 2 y 3

In [19]:
from IPython.display import HTML

HTML('<iframe width="560" height="315" src="https://www.youtube.com/embed/NyT-s4BfZp4" frameborder="0" allowfullscreen></iframe>')
Out[19]:
In [20]:
from IPython.display import HTML

HTML('<iframe width="560" height="315" src="https://www.youtube.com/embed/jcdR-BdOSO4" frameborder="0" allowfullscreen></iframe>')
Out[20]:

Algunas fotografías de las experiencias realizadas: photo_2021-05-11_17-13-49.jpg photo_2021-05-11_17-13-52.jpgphoto_2021-05-11_17-13-54.jpgphoto_2021-05-11_17-13-57.jpgphoto_2021-05-11_17-13-58.jpgphoto_2021-05-11_17-14-00.jpgphoto_2021-05-11_17-14-02.jpg

In [ ]: